import React, { useState, useEffect, useRef } from 'react';
import {
Code,
Gamepad2,
Globe,
Users,
CheckCircle,
Send,
Menu,
X,
ExternalLink,
Calendar,
Zap,
Layers,
ChevronRight,
Monitor,
ChevronDown,
ChevronUp
} from 'lucide-react';
const useOnScreen = (options) => {
const ref = useRef(null);
const [isVisible, setIsVisible] = useState(false);
useEffect(() => {
const observer = new IntersectionObserver(([entry]) => {
if (entry.isIntersecting) {
setIsVisible(true);
observer.unobserve(entry.target);
}
}, options);
if (ref.current) observer.observe(ref.current);
return () => {
if (ref.current) observer.unobserve(ref.current);
};
}, [ref, options]);
return [ref, isVisible];
};
const FadeIn = ({ children, delay = 0, className = "" }) => {
const [ref, isVisible] = useOnScreen({ threshold: 0.1 });
return (
{children}
);
};
const NavLink = ({ href, children, mobile, onClick }) => (
{ if (onClick) onClick(e); }}
className={`
text-slate-400 hover:text-white transition-colors duration-300 text-sm font-medium tracking-wide px-3 py-2 rounded-lg hover:bg-slate-800/50
${mobile ? 'block text-lg py-3 border-b border-slate-800 w-full text-center' : ''}
`}
>
{children}
);
const SectionTitle = ({ title, subtitle }) => (
{title}
{subtitle &&
{subtitle}
}
);
function setFavicon(href) {
if (!href) return;
let link = document.querySelector("link[rel~='icon']");
if (!link) {
link = document.createElement("link");
link.rel = "icon";
document.head.appendChild(link);
}
link.href = href;
}
function fmt(n) {
const x = Number(n);
if (!Number.isFinite(x)) return "—";
return x.toLocaleString();
}
function imgPath(key) {
return `/mainFolder/Images/${key}`;
}
const ExpandableGrid = ({ title, items, type, totals }) => {
const [expanded, setExpanded] = useState(false);
const visibleItems = expanded ? items : items.slice(0, 3);
return (
{type === 'community' && }
{type === 'website' && }
{type === 'game' && }
{title}
{type === "game" && totals && (
Total CCU: {fmt(totals.totalCcu)}
Total Visits: {fmt(totals.totalVisits)}
)}
{type === "community" && totals && (
Total Members: {fmt(totals.totalGroupMembers)}
)}
{visibleItems.map((item, idx) => (
{(type === 'community' || type === 'website' || type === 'game') && (
{item.iconUrl ? (
) : (
{type === 'community' && }
{type === 'website' && }
{type === 'game' && }
)}
{item.name}
{item.badge && (
{item.badge}
)}
{type === "community" && Number.isFinite(Number(item.memberCount)) && (
Members: {fmt(item.memberCount)}
)}
{type === "game" && (
<>
CCU: {fmt(item.playing)}
Visits: {fmt(item.visits)}
Rating: {item.ratingPercent == null ? "—" : `${item.ratingPercent}%`}
>
)}
{item.href && (
)}
)}
))}
{items.length > 3 && (
setExpanded(!expanded)}
className="mt-6 text-sm font-bold text-indigo-400 hover:text-indigo-300 flex items-center gap-1 transition-colors"
>
{expanded ? 'View Less' : 'View All'}
{expanded ? : }
)}
);
};
export default function App() {
const [isMenuOpen, setIsMenuOpen] = useState(false);
const [scrolled, setScrolled] = useState(false);
const [formData, setFormData] = useState({
discord: '',
summary: '',
type: 'New Game',
deadline: ''
});
const [formStatus, setFormStatus] = useState('idle');
const [formErrors, setFormErrors] = useState({});
const [api, setApi] = useState({
games: [],
groups: [],
websites: [],
totals: { totalCcu: 0, totalVisits: 0, totalGroupMembers: 0 }
});
const WORKER_BASE = "";
useEffect(() => {
const handleScroll = () => setScrolled(window.scrollY > 50);
window.addEventListener('scroll', handleScroll);
return () => window.removeEventListener('scroll', handleScroll);
}, []);
useEffect(() => {
document.title = "savhana";
setFavicon(imgPath("WebsiteIcon"));
}, []);
useEffect(() => {
let cancelled = false;
async function load() {
try {
const r = await fetch(`${WORKER_BASE}/api/summary`, { headers: { accept: "application/json" } });
const d = await r.json();
if (!cancelled && d && d.ok) {
const groups = (d.groups || []).map(g => ({
name: g.name || `Group ${g.groupId}`,
badge: g.role || "",
memberCount: g.memberCount,
iconUrl: g.icon || null,
href: `https://www.roblox.com/communities/${g.groupId}`
}));
const games = (d.games || []).map(g => ({
name: g.title || `Game ${g.placeId}`,
badge: "Live",
playing: g.playing,
visits: g.visits,
ratingPercent: g.ratingPercent,
iconUrl: g.icon || null,
href: `https://www.roblox.com/games/${g.placeId}`
}));
const websites = (d.websites || []).map(w => ({
name: w.name,
badge: w.role || "",
iconUrl: imgPath(w.iconKey || "SvStudios"),
href: w.url
}));
setApi({
games,
groups,
websites,
totals: d.totals || { totalCcu: 0, totalVisits: 0, totalGroupMembers: 0 }
});
}
} catch {}
}
load();
const t = setInterval(load, 60_000);
return () => {
cancelled = true;
clearInterval(t);
};
}, []);
const handleInputChange = (field, value) => {
setFormData(prev => ({ ...prev, [field]: value }));
if (formErrors[field]) {
const newErrors = { ...formErrors };
if (field === 'discord' && value.trim().length > 0) delete newErrors.discord;
if (field === 'summary' && value.length >= 100) delete newErrors.summary;
if (field === 'deadline' && value.trim().length > 0) delete newErrors.deadline;
setFormErrors(newErrors);
}
};
const validateForm = () => {
const errors = {};
if (!formData.discord.trim()) errors.discord = "Discord username is required";
if (formData.summary.length < 100) errors.summary = "Summary must be at least 100 characters";
if (!formData.deadline.trim()) errors.deadline = "Date is required";
return errors;
};
const handleSubmit = async (e) => {
e.preventDefault();
const errors = validateForm();
if (Object.keys(errors).length > 0) {
setFormErrors(errors);
return;
}
setFormErrors({});
setFormStatus('submitting');
try {
const token = window.turnstile ? await new Promise((resolve) => {
window.turnstile.render("#ts", {
sitekey: window.__TURNSTILE_SITEKEY || "",
callback: (t) => resolve(t),
"error-callback": () => resolve("")
});
}) : "";
const r = await fetch(`${WORKER_BASE}/api/apply`, {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ ...formData, turnstileToken: token })
});
const d = await r.json().catch(() => null);
if (d && d.ok) {
setFormStatus('success');
setFormData({ discord: '', summary: '', type: 'New Game', deadline: '' });
setTimeout(() => setFormStatus('idle'), 3000);
} else {
setFormStatus('idle');
}
} catch {
setFormStatus('idle');
}
};
const remainingChars = 100 - formData.summary.length;
return (
savhana
Home
Work & Affiliations
Contact
setIsMenuOpen(!isMenuOpen)}>
{isMenuOpen ? : }
{isMenuOpen && (
setIsMenuOpen(false)}>Home
setIsMenuOpen(false)}>Work
setIsMenuOpen(false)}>Request
setIsMenuOpen(false)}>Contact
)}
Accepting Commissions
Roblox Scripter
Professional, modular, and optimized Luau programming. Over 6 years of experience delivering high-quality systems with fast turnaround times.
I am a fast, reliable scripter with over 6+ years active in the Roblox developer community. My focus is on writing code that isn't just functional, but scalable and easy to maintain.
I specialize in modular architecture, meaning the systems I build for you are easy to import, configure, and expand upon. Whether you need complex backend data stores or responsive UI interactions, I ensure optimization is a priority to keep your game running smoothly.
{[
{ icon: Zap, title: "Optimized Performance", desc: "Lag-free code practices" },
{ icon: Layers, title: "Modular Architecture", desc: "Easy to edit & expand" },
{ icon: Monitor, title: "Owner of SV Studios", desc: "svstudiosinfo.com" },
{ icon: Users, title: "Community Leader", desc: "Group Owner & Manager" },
].map((item, idx) => (
))}
Scripting Services
Full system implementation, bug fixes, UI programming, and backend data management.
$30 – $45 /hr
R$ 9,000 – R$ 12,000 /hr
{[
"Clean, Annotated Code",
"Modular Systems",
"DataStore Security",
"UI Animation & Logic",
"Server-Client Optimization",
"Bug Free"
].map((feat, i) => (
{feat}
))}
Request a Commission
Please fill out the details below accurately.
);
}